#-*- coding: utf-8 -*-

def contient(nbre, chiffre):
	while nbre:
		d = nbre % 10
		if chiffre==d:
			return True
		nbre = nbre / 10
	return False

def pgcd(x, y):
	if y==0:
		return x
	return pgcd(y, x%y)

def est_multiple(x, y):
	return pgcd(x, y)==x

def ackermann(m, n):
	if m == 0:
		return n+1
	elif m>0 and n==0:
		return ackermann(m-1, 1)
	else: #m>0 and n>0
		return ackermann(m-1, ackermann(m, n-1))

def trianglePascal(i, j):
	if i==0 and j==0:
		return 1
	#Est-ce qu'on sort du triangle ?
	if i<1 or j>i:
		#Oui : on considère que c'est nul
		return 0
	else:
		#Non : somme de la case au-dessus et au-dessus à gauche
		return trianglePascal(i-1, j)+trianglePascal(i-1, j-1)

def eval(exp, d=0):
	if d:
		print "eval(", exp, ")"
	#Si on a reçu un nombre en paramètre,
	#on retourne simplement ce nombre.
	if isinstance(exp, int):
		return exp
	elif isinstance(exp, float):
		return exp
	#Sinon, c'est un tuple (a,op,b)
	#On extrait chaque morceau
	a, op, b = exp
	#On calcule les opérandes (VALEURS !)
	valA = eval(a, d)
	valB = eval(b, d)
	#Selon l'opérateur, on effectue l'opération
	if op=='+':
		return valA+valB
	elif op=='-':
		return valA-valB
	elif op=='*':
		return valA*valB
	elif op=='/':
		return valA/valB
	else:
		print "WATTA F**K? C'est quoi,", op, "?"


print eval((((18, '*', 3), '+', (14, '/', 2)), '-', 1))
